package com.ch.engine.daily.abstractTest;

/**
 * 抽象支付处理器 - 展示抽象类特点
 * 抽象类特点：
 * 1. 可以有抽象方法和具体方法
 * 2. 可以有成员变量和构造方法
 * 3. 只支持单继承
 * 4. 可以有访问修饰符
 * 5. 适合作为模板方法模式的基类
 *
 * @author wangchunhui
 * @date 2025/8/6 17:40
 */
public abstract class AbstractPaymentProcessor {

    // 抽象类可以有成员变量
    protected String processorName;
    protected double feeRate;

    // 抽象类可以有构造方法
    public AbstractPaymentProcessor(String processorName, double feeRate) {
        this.processorName = processorName;
        this.feeRate = feeRate;
    }

    // 具体方法 - 通用逻辑
    public void log(String method, double amount) {
        System.out.println("[" + processorName + "] 日志：使用 " + method + " 支付了 " + amount + " 元");
    }

    // 具体方法 - 计算手续费
    public double calculateFee(double amount) {
        return amount * feeRate;
    }

    // 模板方法模式 - 定义支付流程
    public final boolean executePayment(double amount) {
        System.out.println("\n=== 开始支付流程 ===");

        // 1. 验证金额
        if (!validatePayment(amount)) {
            System.out.println("支付验证失败");
            return false;
        }

        // 2. 计算费用
        double fee = calculateFee(amount);
        double totalAmount = amount + fee;
        System.out.println("手续费：" + fee + " 元，总金额：" + totalAmount + " 元");

        // 3. 执行具体支付逻辑（由子类实现）
        boolean result = doPayment(totalAmount);

        // 4. 记录日志
        if (result) {
            log(processorName, totalAmount);
            afterPaymentSuccess(amount);
        } else {
            System.out.println("支付失败");
        }

        System.out.println("=== 支付流程结束 ===\n");
        return result;
    }

    // 具体方法 - 默认验证逻辑
    protected boolean validatePayment(double amount) {
        return amount > 0;
    }

    // 抽象方法 - 具体支付实现由子类完成
    protected abstract boolean doPayment(double amount);

    // 钩子方法 - 子类可选择性重写
    protected void afterPaymentSuccess(double amount) {
        // 默认空实现
    }

    // Getter方法
    public String getProcessorName() {
        return processorName;
    }
}
